package com.example;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import com.example.entity.Address;
import com.example.entity.Person;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Map;

@SpringBootTest
public class TransOJM {

    @Test
    public void test1() {
        // Java 对象 → JSON 字符串（含嵌套）
        /**
         * Hutool 会自动递归处理嵌套对象
         */
        Address address = new Address("beijing");
        Person person = new Person("Tom", 18, address);
        String jsonStr = JSONUtil.toJsonStr(person);
        System.out.println(jsonStr);
    }

    @Test
    public void test2() {
        // JSON 字符串（含嵌套） → Java 对象
        /**
         * 注意事项：
         * 嵌套类必须有无参构造器
         * 字段名必须匹配
         */
        String jsonStr = "{\"name\":\"Tom\",\"age\":18,\"address\":{\"city\":\"Beijing\"}}";
        Person person = JSONUtil.toBean(jsonStr, Person.class);
        System.out.println(person);
        System.out.println(person.getAddress().getCity()); // Beijing
    }

    @Test
    public void test3() {
        // Java 对象 → Map（含嵌套）
        /**
         * Hutool 默认不会递归把嵌套类转为嵌套 Map，除非手动处理（见进阶）
         */
        Address address = new Address("beijing");
        Person person = new Person("Tom", 18, address);
        Map<String, Object> map = BeanUtil.beanToMap(person);
        System.out.println(map);
    }

    @Test
    public void test4() {
        // JSON 字符串 → Map（嵌套结构也被解析）
        String jsonStr = "{\"name\":\"Tom\",\"age\":18,\"address\":{\"city\":\"Beijing\"}}";
        Map map = JSONUtil.toBean(jsonStr, Map.class);
        System.out.println(map);
        System.out.println(map.get("address")); // LinkedHashMap

        Address addr = BeanUtil.mapToBean((Map) map.get("address"), Address.class, true);
        System.out.println(addr);
    }

}
